package com.hxzf.mvp.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hxzf.mvp.commons.BaseServiceImpl;
import com.hxzf.mvp.dao.UserMapper;
import com.hxzf.mvp.dao.entity.User;
import com.hxzf.mvp.service.UserService;
import com.hxzf.mvp.service.dto.UserQuery;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 用户服务
 *
 * @author Kai
 * @date 2021/6/21 17:01
 **/
@Slf4j
@Service
public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implements UserService {

    /***
     * 根据条件查询用户列表
     *
     * <p>演示复杂条件单表查询。
     *
     * @param param 查询参数
     * @return 用户列表
     */
    @Override
    @Transactional(readOnly = true)
    public List<User> findByCondition(UserQuery param) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        return baseMapper.selectList(queryWrapper.lambda()
                // 请保持缩进
                .eq(StringUtils.isNotBlank(param.getTel()), User::getTel, param.getTel())
                .eq(StringUtils.isNotBlank(param.getEmail()), User::getEmail, param.getEmail())
                .likeRight(StringUtils.isNotBlank(param.getUsername()), User::getUsername, param.getUsername())
                .ge(param.getRegDateStart() != null, User::getCreateTime, param.getRegDateStart())
                .le(param.getRegDateEnd() != null, User::getCreateTime, param.getRegDateEnd())
                // 默认排序，如果入参又排序参数则会覆盖掉
                .orderByDesc(param.getOrderBy() == null, User::getCreateTime)
        );
    }

    /***
     * 根据条件查询用户列表
     *
     * <p>当MP对象查询无法实现，或者过于复杂时，可以使用MyBatis原生查询。
     * <p>PS. {@code UserQuery}对象可以直接传递到XML Mapper使用。
     *
     * @param param 查询参数
     * @return 用户列表
     */
    @Override
    @Transactional(readOnly = true)
    public List<User> findByCondition2(UserQuery param) {
        return baseMapper.selectNative(param);
    }
}
